# 虽然通过 Python 提供的索引操作符"[]"和属性操作符"."可以访问 Series 或者 DataFrame 中的数据，
# 但这种方式只适应与少量的数据，为了解决这一问题，Pandas 提供了两种类型的索引方式来实现数据的访问。

# .loc[]	基于标签索引选取数据
# .iloc[]	基于整数索引选取数据

import numpy as np
import pandas as pd

# 创建一组数据
data = {'name': ['John', 'Mike', 'Mozla', 'Rose', 'David', 'Marry', 'Wansi', 'Sidy', 'Jack', 'Alic'],
        'age': [20, 32, 29, np.nan, 15, 28, 21, 30, 37, 25],
        'gender': [0, 0, 1, 1, 0, 1, 0, 0, 1, 1],
        'isMarried': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
label = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data, index=label)
print(df)
# loc[] 接受两个参数，并以','分隔。第一个位置表示行，第二个位置表示列。
# 对行操作
print(df.loc['a':'d', :])  # 等同于df.loc['a':'d']
# 对列进行操作
print(df.loc[:, 'name'])
# 同时操作
print(df.loc[['a', 'b', 'f', 'h'], ['name', 'age']])
# print(df.loc['b'] > 0)  # 返回一组布尔值

# df.iloc[] 只能使用整数索引，不能使用标签索引，通过整数索引切片选择数据时，前闭后开(不包含边界结束值)。
# 同 Python 和 NumPy 一样，它们的索引都是从 0 开始。
print(df.iloc[2:, ])
#     name   age  gender isMarried
# c  Mozla  29.0       1        no
# d   Rose   NaN       1       yes
# e  David  15.0       0        no
# f  Marry  28.0       1        no
# g  Wansi  21.0       0        no
# h   Sidy  30.0       0       yes
# i   Jack  37.0       1        no
# j   Alic  25.0       1        no
print(df.iloc[[1, 3, 5], [1, 3]])
print(df.iloc[1:3, :])
print(df.iloc[:, 1:3])
